package 链表.相交链表;

/**
 * 给你两个单链表的头节点 headA 和 headB ，
 * 请你找出并返回两个单链表相交的起始节点。
 * 如果两个链表不存在相交节点，返回 null 。
 *题目数据 保证 整个链式结构中不存在环。
 * 简单来说就是求两个链表交点的指针，
 * 力扣160地址：https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
 * */
/**
 * 解释思路
 * 首先要明白交点是指针相等而不是数据相等
 * 1，分析题目
 * 这题的话有三种情况
 * 情况一：两链表长度相等，一直相交
 * 情况二：A链表比B链表长，A链表先走，A链表走完之后和B链表开始相交
 * 情况三：只有一个交点，然后在分开
 * 2，思路
 * 1，既然拿长度来说的话，那就先求一下每个链表的长度
 * 2，求出长度后，让长的链表先走，然后两个链表一起走，
 * 如果两个链表相交，那么最终的指针就是相交的指针
 * 3，中间
 * 求出长度后，要记得将长链表设置为A，因为不求的话
 * 就需要判断长链表和短链表，增加了代码的冗余
 *
 *
 * */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode clxA = headA;
        ListNode clxB = headB;
        int lenA = 0;
        int lenB = 0;
        while(clxA != null){
            lenA++;
            clxA = clxA.next;
        }
        while(clxB != null){
            lenB++;
            clxB = clxB.next;
        }
        clxA = headA;
        clxB = headB;
        if(lenB > lenA){
            int tem = lenB;
            lenB = lenA;
            lenA = tem;
            ListNode temp = clxB;
            clxB = clxA;
            clxA = temp;
        }
        int cha = lenA - lenB;
        for(int i = 0; i < cha; i++){
            clxA = clxA.next;
        }
        while(clxA != null){
            if(clxA == clxB){
                return clxA;
            }
            clxA = clxA.next;
            clxB = clxB.next;
        }
        return null;
    }
}